package edu.njust.cma.util;

import edu.njust.cma.DTO.ImportExcel;
import org.apache.poi.ss.usermodel.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ExcelImportUtils {

    /**
     * 读取Excel文件内容
     * @param file 上传的Excel文件
     * @return 返回解析后的对象列表
     */
    public static List<ImportExcel> readExcel(MultipartFile file) throws Exception {
        List<ImportExcel> dataList = new ArrayList<>();
        InputStream in = file.getInputStream();
        Workbook workbook = WorkbookFactory.create(in);
        Sheet sheet = workbook.getSheetAt(0);

        for (Row row : sheet) {
            if (isRowEmpty(row)) {
                continue;  // 跳过空行
            }
            ImportExcel importExcel = parseRow(row);
            dataList.add(importExcel);
        }
        return dataList;
    }

    /**
     * 解析行数据
     *
     * @param row Excel中的一行
     * @return 返回解析后的对象
     */
    private static ImportExcel parseRow(Row row) {
        ImportExcel importExcel = new ImportExcel();
        // 根据Excel结构解析行数据
        // 例如: obj.setField1(row.getCell(0).getStringCellValue());
        importExcel.setMajorCategoryName(row.getCell(0).getStringCellValue());
        importExcel.setMinorCategoryName(row.getCell(1).getStringCellValue());
        importExcel.setMethodName(row.getCell(2).getStringCellValue());
        importExcel.setStandardName(row.getCell(3).getStringCellValue());
        importExcel.setStandardNumber(row.getCell(5).getStringCellValue());
        return importExcel;
    }

    /**
     * 检查行是否为空
     * @param row Excel中的一行
     * @return 如果行为空返回true，否则返回false
     */
    private static boolean isRowEmpty(Row row) {
        if (row == null) {
            return true;
        }
        for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
            Cell cell = row.getCell(c);
            if (cell != null && cell.getCellType() != CellType.BLANK) {
                return false;
            }
        }
        return true;
    }
}

